import { requestClient } from '../request';

/**
 * 导入相关API服务
 */
export namespace ImportApi {
  /**
   * 获取Excel文件中的工作表名称
   * @param file Excel文件
   * @returns 工作表名称列表
   */
  export async function getSheetNames(file: File): Promise<{
    code: number;
    message: string;
    sheet_names: string[];
  }> {
    const formData = new FormData();
    formData.append('file', file);

    try {
      const response = await requestClient.post(
        '/api/admin/import/get_sheet_names/',
        formData,
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );

      // 确保返回的数据格式正确
      if (response && typeof response === 'object') {
        // 如果response本身就包含code: 200和sheet_names，直接返回
        if (
          'code' in response &&
          response.code === 200 &&
          'sheet_names' in response
        ) {
          return response;
        }
        // 否则检查response.data
        if (
          'data' in response &&
          response.data &&
          typeof response.data === 'object'
        ) {
          // 如果data包含code: 200和sheet_names，返回data
          if (
            'code' in response.data &&
            response.data.code === 200 &&
            'sheet_names' in response.data
          ) {
            return response.data;
          }
          // 如果data本身是包含code: 200的成功响应，直接返回
          if ('code' in response.data && response.data.code === 200) {
            return response.data;
          }
        }
        // 如果响应不包含code和message，但包含sheet_names，构造成功响应
        if ('sheet_names' in response) {
          return {
            code: 200,
            message: '获取成功',
            sheet_names: response.sheet_names,
          };
        }
        // 如果response.data包含sheet_names，构造成功响应
        if (
          'data' in response &&
          response.data &&
          'sheet_names' in response.data
        ) {
          return {
            code: 200,
            message: '获取成功',
            sheet_names: response.data.sheet_names,
          };
        }

        // 如果响应格式完全不符合预期，才抛出错误
        console.warn('响应格式不符合预期:', response);
      }

      // 如果到达这里，表示确实有问题，抛出清晰的错误信息
      throw new Error('无法从响应中提取有效的工作表名称数据');
    } catch (error) {
      // 首先检查错误对象是否为成功响应
      if (
        error &&
        typeof error === 'object' &&
        'code' in error &&
        error.code === 200 &&
        'sheet_names' in error
      ) {
        return error as {
          code: number;
          message: string;
          sheet_names: string[];
        };
      }
      // 只有真正的错误才打印错误日志并抛出
      console.error('获取工作表名称失败:', error);
      throw error;
    }
  }

  /**
   * 获取工作表的表头信息
   * @param file Excel文件
   * @param sheetName 工作表名称
   * @param startRow 表头开始行号
   * @returns 表头列表
   */
  export async function getHeaders(
    file: File,
    sheetName: string,
    startRow: number = 1,
  ): Promise<{
    code: number;
    headers: string[];
    message: string;
  }> {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('sheet_name', sheetName);
    formData.append('start_row', startRow.toString());

    try {
      const response = await requestClient.post(
        '/api/admin/import/get_headers/',
        formData,
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );

      // 确保返回的数据格式正确
      if (response && typeof response === 'object') {
        // 如果response本身就符合预期格式，直接返回
        if (
          'code' in response &&
          'message' in response &&
          'headers' in response
        ) {
          return response;
        }
        // 否则尝试从response.data中提取数据
        if (
          'data' in response &&
          response.data &&
          typeof response.data === 'object'
        ) {
          return response.data;
        }
      }

      // 如果响应格式不符合预期，抛出错误
      throw new Error('响应格式不正确');
    } catch (error) {
      // 首先检查错误对象是否为成功响应
      const errorObj = error as any;
      if (
        errorObj &&
        typeof errorObj === 'object' &&
        errorObj.code === 200 &&
        'headers' in errorObj
      ) {
        return errorObj;
      }
      console.error('获取表头信息失败:', error);
      throw error;
    }
  }

  /**
   * 获取数据预览
   * @param file Excel文件
   * @param sheetName 工作表名称
   * @param startRow 表头开始行号
   * @param moduleType 模块类型
   * @param fieldMappings 字段映射关系
   * @returns 预览数据列表
   */
  export async function getPreviewData(
    file: File,
    sheetName: string,
    startRow: number = 1,
    moduleType: string,
    fieldMappings: string[],
  ): Promise<{
    code: number;
    message: string;
    preview_data: Record<string, any>[];
  }> {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('sheet_name', sheetName);
    formData.append('start_row', startRow.toString());
    formData.append('module_type', moduleType);
    formData.append('field_mappings', JSON.stringify(fieldMappings));

    try {
      const response = await requestClient.post(
        '/api/admin/import/preview_data/',
        formData,
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );

      // 确保返回的数据格式正确
      if (response && typeof response === 'object') {
        // 如果response本身就符合预期格式，直接返回
        if (
          'code' in response &&
          'message' in response &&
          'preview_data' in response
        ) {
          return response;
        }
        // 否则尝试从response.data中提取数据
        if (
          'data' in response &&
          response.data &&
          typeof response.data === 'object'
        ) {
          return response.data;
        }
      }

      // 如果响应格式不符合预期，抛出错误
      throw new Error('响应格式不正确');
    } catch (error) {
      // 首先检查错误对象是否为成功响应
      const errorObj = error as any;
      if (
        errorObj &&
        typeof errorObj === 'object' &&
        errorObj.code === 200 &&
        'preview_data' in errorObj
      ) {
        return errorObj;
      }
      console.error('获取数据预览失败:', error);
      throw error;
    }
  }

  /**
   * 执行数据导入
   * @param file Excel文件
   * @param sheetName 工作表名称
   * @param startRow 表头开始行号
   * @param moduleType 模块类型
   * @param fieldMappings 字段映射关系
   * @returns 导入结果
   */
  export async function doImport(
    file: File,
    sheetName: string,
    startRow: number = 1,
    moduleType: string,
    fieldMappings: string[],
  ): Promise<{
    code: number;
    data: {
      error_messages: string[];
      fail_count: number;
      success_count: number;
    };
    message: string;
  }> {
    const formData = new FormData();
    formData.append('file', file);
    formData.append('sheet_name', sheetName);
    formData.append('start_row', startRow.toString());
    formData.append('module_type', moduleType);
    formData.append('field_mappings', JSON.stringify(fieldMappings));

    try {
      const response = await requestClient.post(
        '/api/admin/import/do_import/',
        formData,
        {
          headers: {
            'Content-Type': 'multipart/form-data',
          },
        },
      );

      // 确保返回的数据格式正确
      if (response && typeof response === 'object') {
        // 如果response本身就符合预期格式，直接返回
        if ('code' in response && 'message' in response && 'data' in response) {
          return response;
        }
        // 否则尝试从response.data中提取数据
        if (
          'data' in response &&
          response.data &&
          typeof response.data === 'object'
        ) {
          return response.data;
        }
      }

      // 如果响应格式不符合预期，抛出错误
      throw new Error('响应格式不正确');
    } catch (error) {
      // 首先检查错误对象是否为成功响应
      const errorObj = error as any;
      if (
        errorObj &&
        typeof errorObj === 'object' &&
        errorObj.code === 200 &&
        'data' in errorObj
      ) {
        return errorObj;
      }
      console.error('执行数据导入失败:', error);
      throw error;
    }
  }
}
